# @Time    :2025/4/8 19:10
"""
、多线程相关
题目：编写一个 Python 程序，创建 5 个线程，
每个线程都对一个全局变量进行 20 次加 1 操作。为了避免线程安全问题，
使用互斥锁来保护全局变量。最后输出全局变量的最终值，预期结果应该是 100。
"""
import time
import threading

"""
 threading.Lock() 创建互斥锁。
 使用 lock.acquire([blocking=True][, timeout=-1]) 来获取锁（blocking 如果为 True，线程会阻塞直到获取到锁。
 使用 lock.release() 释放锁。#判断完释放，#执行完再释放一次

"""


def func():
    global nums
    for _ in range(20):  # --等同   for i in range(1, 21):
        lock.acquire()
        try:
            nums += 1
        finally:
            lock.release()
        time.sleep(0.01)


if __name__ == "__main__":
    lock = threading.Lock()
    # 定义一个全局变量
    nums = 0
    threads = [threading.Thread(target=func) for _ in range(5)]  # range(5)：三个线程
    [t.start() for t in threads]
    [t.join() for t in threads]
    print(nums)




# ===== =等同于这样写============================================================
"""def func():
    global nums
    for _ in range(20):  # --等同   for i in range(1, 21):
        lock.acquire()  #-------------------获取锁
        nums += 1
        lock.release()  #--------------------释放锁
    time.sleep(0.01)


if __name__ == "__main__":
    lock = threading.Lock()  #----------------创建一把锁
    # 定义一个全局变量
    nums = 0

    threads = [threading.Thread(target=func) for _ in range(5)]  # range(5)：三个线程
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print(nums)
"""